import os,json
import subprocess   # 进行命令行操作

def merge(inDir, outDir, ffmpeg):
    av_list = os.listdir(inDir)  # 获取视频列表，视频目录名就是视频的av号
    for av in av_list:           # 遍历每个视频，
        av_dir = inDir + "/" + av      # 拼接路径与文件名，得到每个av号的路径
        part_list = os.listdir(av_dir)   # 分P(part)的视频，每个av号会对应多个视频，在此得到part的列表

        for part in part_list:       # 遍历视频的每P
            part_dir = av_dir + "/" + part
            # 在每个part下面，会有一个用数字命名文件夹，一个xml，一个json。猜测数字代表的是视频的清晰度
            # 我们的视频在那个用数字命名的文件夹里面
            sub_part_list = os.listdir(part_dir)   # 得到每P文件夹下的文件目录，以C_

            with open(part_dir+'/entry.json', 'r') as file:
                # 将JSON内容加载为字典或列表对象
                data = json.load(file)
            # 根据键名获取相应的值
            video_name = data['title']+data['page_data']['part']

            for sub_part in sub_part_list:     # 遍历每P下的文件
                if (sub_part.isdigit()):    # 只需要对 以数字命名的文件夹 进行操作
                    # 在以数字命名的文件夹下面，会有三个文件，其中audio.m4s和video.m4s是我们需要的
                    # 他们分别是我们下载的视频的 音频和没有声音的视频 
                    # 我们把这两个文件通过ffmpeg混流，就可以还原出之前下载的视频
                    file_path = part_dir + "/" + sub_part
                    # file_path即为audio.m4s和video.m4s的路径
                    command = ffmpeg + file_path + '/audio.m4s' + ' -i '+ file_path + '/video.m4s' + ' -acodec copy -vcodec copy '+'"'+outDir + '/' + video_name+'.mp4"'
                        # 使用命令行进行混流
                    print(command)
                    #subprocess.Popen(command, stdout=subprocess.PIPE)   # 执行命令
                    os.system(command)
                #break

def main():
    inDir = "/home/minux/vedio/download"  # 视频的总目录,即输入内容。注意双反斜线
    outDir = "/home/minux/vedio/download_res"  # 视频的输出目录，转换好的视频会放到这里

    # ffmpeg的路径，注意'-i'后面有空格
    ffmpeg = 'ffmpeg -i '
    merge(inDir, outDir, ffmpeg)

if __name__ == '__main__':
    main()
